package com.ztom.top100;

/**
 * 颜色分类
 * <p>
 * https://leetcode-cn.com/problems/sort-colors/
 *
 * @author ZhangTao
 */
public class Code31SortColors {

    public void sortColors(int[] nums) {
        if (nums == null || nums.length <= 1) {
            return;
        }

        // 小于区域右边界
        int l = -1;
        // 大于区域左边界
        int r = nums.length;
        // 等于区域元素值
        int num = 1;
        int index = 0;
        while (index < r) {
            if (nums[index] == num) {
                index++;
            } else if (nums[index] < num) {
                // 小于区域右扩
                swap(nums, ++l, index++);
            } else {
                // 大于区域左扩, 当前 index 交换后仍需要比较
                swap(nums, --r, index);
            }
        }
    }

    private void swap(int[] nums, int l, int r) {
        int tmp = nums[l];
        nums[l] = nums[r];
        nums[r] = tmp;
    }
}
